3D ๋ ๋๋ง ํ์ดํ๋ผ์ธ ๋ด์ ๋ฒํ ์ค ๋ฐ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋์ ๋ํ ์ฌ์ธต ํ๊ตฌ๋ก, ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ฅผ ์ํ ๊ฐ๋ , ๊ธฐ์ ๋ฐ ์ค์ ์ ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
3D ๋ ๋๋ง ํ์ดํ๋ผ์ธ: ๋ฒํ ์ค ๋ฐ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋ ๋ง์คํฐํ๊ธฐ
3D ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๋น๋์ค ๊ฒ์๊ณผ ๊ฑด์ถ ์๊ฐํ๋ถํฐ ๊ณผํ ์๋ฎฌ๋ ์ด์ ๊ณผ ์ฐ์ ๋์์ธ ์ํํธ์จ์ด์ ์ด๋ฅด๊ธฐ๊น์ง 3D ๊ทธ๋ํฝ์ ํ์ํ๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ์ ๋๋ค. ๊ทธ ๋ณต์ก์ฑ์ ์ดํดํ๋ ๊ฒ์ ๊ณ ํ์ง์ ์ฑ๋ฅ ์ข์ ๋น์ฃผ์ผ์ ๊ตฌํํ๋ ค๋ ๊ฐ๋ฐ์์๊ฒ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด ํ์ดํ๋ผ์ธ์ ์ค์ฌ์๋ ๋ฒํ ์ค ์ ฐ์ด๋(vertex shader)์ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋(fragment shader)๊ฐ ์์ผ๋ฉฐ, ์ด๋ ์ง์ค๋ฉํธ๋ฆฌ์ ํฝ์ ์ด ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์๋ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฅํ ๋จ๊ณ์ ๋๋ค. ์ด ๊ธ์์๋ ์ด๋ฌํ ์ ฐ์ด๋์ ์ญํ , ๊ธฐ๋ฅ ๋ฐ ์ค์ ์ ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ๋ฉฐ ํฌ๊ด์ ์ผ๋ก ํ๊ตฌํฉ๋๋ค.
3D ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ์ดํด
๋ฒํ ์ค ๋ฐ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋์ ์ธ๋ถ ์ฌํญ์ ์ดํด๋ณด๊ธฐ ์ ์, ์ ์ฒด 3D ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๋ํ ํ์คํ ์ดํด๊ฐ ํ์์ ์ ๋๋ค. ํ์ดํ๋ผ์ธ์ ํฌ๊ฒ ์ฌ๋ฌ ๋จ๊ณ๋ก ๋๋ ์ ์์ต๋๋ค:
- ์ ๋ ฅ ์กฐ๋ฆฝ(Input Assembly): ๋ฉ๋ชจ๋ฆฌ์์ ๋ฒํ ์ค ๋ฐ์ดํฐ(์์น, ๋ฒ์ , ํ ์ค์ฒ ์ขํ ๋ฑ)๋ฅผ ์์งํ์ฌ ํ๋ฆฌ๋ฏธํฐ๋ธ(์ผ๊ฐํ, ์ , ์ )๋ก ์กฐ๋ฆฝํฉ๋๋ค.
- ๋ฒํ ์ค ์ ฐ์ด๋(Vertex Shader): ๊ฐ ๋ฒํ ์ค๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ ๋ณํ, ์กฐ๋ช ๊ณ์ฐ ๋ฐ ๊ธฐํ ๋ฒํ ์ค๋ณ ์ฐ์ฐ์ ์ํํฉ๋๋ค.
- ์ง์ค๋ฉํธ๋ฆฌ ์ ฐ์ด๋(Geometry Shader) (์ ํ ์ฌํญ): ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ์์ฑํ๊ฑฐ๋ ํ๊ดดํ ์ ์์ต๋๋ค. ์ด ๋จ๊ณ๋ ํญ์ ์ฌ์ฉ๋๋ ๊ฒ์ ์๋์ง๋ง ์ฆ์์์ ์๋ก์ด ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ์์ฑํ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ํด๋ฆฌํ(Clipping): ๋ทฐ ํ๋ฌ์คํ (์นด๋ฉ๋ผ์ ๋ณด์ด๋ ๊ณต๊ฐ ์์ญ) ์ธ๋ถ์ ์๋ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ํ๊ธฐํฉ๋๋ค.
- ๋์คํฐํ(Rasterization): ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ํ๋๊ทธ๋จผํธ(์ ์ฌ์ ํฝ์ )๋ก ๋ณํํฉ๋๋ค. ์ด๋ ํ๋ฆฌ๋ฏธํฐ๋ธ์ ํ๋ฉด์ ๊ฑธ์ณ ๋ฒํ ์ค ์์ฑ์ ๋ณด๊ฐํ๋ ์์ ์ ํฌํจํฉ๋๋ค.
- ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋(Fragment Shader): ๊ฐ ํ๋๊ทธ๋จผํธ๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ต์ข ์์์ ๊ฒฐ์ ํฉ๋๋ค. ํ ์ค์ฒ๋ง, ์ ฐ์ด๋ฉ, ์กฐ๋ช ๊ณผ ๊ฐ์ ํฝ์ ๋ณ ํจ๊ณผ๊ฐ ์ ์ฉ๋๋ ๊ณณ์ ๋๋ค.
- ์ถ๋ ฅ ๋ณํฉ(Output Merging): ๊น์ด ํ ์คํธ, ๋ธ๋ ๋ฉ, ์ํ ํฉ์ฑ ๊ฐ์ ์์๋ฅผ ๊ณ ๋ คํ์ฌ ํ๋๊ทธ๋จผํธ ์์์ ํ๋ ์ ๋ฒํผ์ ๊ธฐ์กด ๋ด์ฉ๊ณผ ๊ฒฐํฉํฉ๋๋ค.
๋ฒํ ์ค ๋ฐ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ ๊ฐ๋ฐ์๊ฐ ๋ ๋๋ง ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ฅ ์ง์ ์ ์ผ๋ก ์ ์ดํ ์ ์๋ ๋จ๊ณ์ ๋๋ค. ๋ง์ถคํ ์ ฐ์ด๋ ์ฝ๋๋ฅผ ์์ฑํจ์ผ๋ก์จ ๋ค์ํ ์๊ฐ ํจ๊ณผ์ ์ต์ ํ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
๋ฒํ ์ค ์ ฐ์ด๋: ์ง์ค๋ฉํธ๋ฆฌ ๋ณํ
๋ฒํ ์ค ์ ฐ์ด๋๋ ํ์ดํ๋ผ์ธ์ ์ฒซ ๋ฒ์งธ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฅํ ๋จ๊ณ์ ๋๋ค. ์ฃผ์ ์ญํ ์ ์ ๋ ฅ ์ง์ค๋ฉํธ๋ฆฌ์ ๊ฐ ๋ฒํ ์ค๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์์ ํฌํจํฉ๋๋ค:
- ๋ชจ๋ธ-๋ทฐ-ํฌ์ ๋ณํ(Model-View-Projection Transformation): ๋ฒํ ์ค๋ฅผ ์ค๋ธ์ ํธ ๊ณต๊ฐ์์ ์๋ ๊ณต๊ฐ, ๊ทธ๋ฆฌ๊ณ ๋ทฐ ๊ณต๊ฐ(์นด๋ฉ๋ผ ๊ณต๊ฐ)์ ๊ฑฐ์ณ ์ต์ข ์ ์ผ๋ก ํด๋ฆฝ ๊ณต๊ฐ์ผ๋ก ๋ณํํฉ๋๋ค. ์ด ๋ณํ์ ์ฌ์ ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐฐ์นํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋ฒํ ์ค ์์น์ ๋ชจ๋ธ-๋ทฐ-ํฌ์(MVP) ํ๋ ฌ์ ๊ณฑํ๋ ๊ฒ์ ๋๋ค.
- ๋ฒ์ ๋ณํ(Normal Transformation): ๋ณํ ํ์๋ ํ๋ฉด์ ์์ง์ ์ ์งํ๋๋ก ๋ฒํ ์ค ๋ฒ์ ๋ฒกํฐ๋ฅผ ๋ณํํฉ๋๋ค. ์ด๋ ํนํ ์กฐ๋ช ๊ณ์ฐ์ ์ค์ํฉ๋๋ค.
- ์์ฑ ๊ณ์ฐ(Attribute Calculation): ํ ์ค์ฒ ์ขํ, ์์ ๋๋ ํ์ ํธ ๋ฒกํฐ์ ๊ฐ์ ๋ค๋ฅธ ๋ฒํ ์ค ์์ฑ์ ๊ณ์ฐํ๊ฑฐ๋ ์์ ํฉ๋๋ค. ์ด๋ฌํ ์์ฑ๋ค์ ํ๋ฆฌ๋ฏธํฐ๋ธ ํ๋ฉด์ ๊ฑธ์ณ ๋ณด๊ฐ๋์ด ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ก ์ ๋ฌ๋ฉ๋๋ค.
๋ฒํ ์ค ์ ฐ์ด๋ ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ
๋ฒํ ์ค ์ ฐ์ด๋๋ ๋ฒํ ์ค ์์ฑ์ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ๋ณํ๋ ๋ฒํ ์ค ์์ฑ์ ์ถ๋ ฅ์ผ๋ก ์์ฑํฉ๋๋ค. ํน์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง, ์ผ๋ฐ์ ์ธ ์ ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์์น(Position): ์ค๋ธ์ ํธ ๊ณต๊ฐ์์์ ๋ฒํ ์ค ์์น.
- ๋ฒ์ (Normal): ๋ฒํ ์ค ๋ฒ์ ๋ฒกํฐ.
- ํ ์ค์ฒ ์ขํ(Texture Coordinates): ํ ์ค์ฒ ์ํ๋ง์ ์ํ ํ ์ค์ฒ ์ขํ.
- ์์(Color): ๋ฒํ ์ค ์์.
๋ฒํ ์ค ์ ฐ์ด๋๋ ์ต์ํ ํด๋ฆฝ ๊ณต๊ฐ(clip space)์์์ ๋ณํ๋ ๋ฒํ ์ค ์์น๋ฅผ ์ถ๋ ฅํด์ผ ํฉ๋๋ค. ๋ค๋ฅธ ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค:
- ๋ณํ๋ ๋ฒ์ (Transformed Normal): ๋ณํ๋ ๋ฒํ ์ค ๋ฒ์ ๋ฒกํฐ.
- ์์ ๋๊ฑฐ๋ ๊ณ์ฐ๋ ํ ์ค์ฒ ์ขํ(Texture Coordinates): ์์ ๋๊ฑฐ๋ ๊ณ์ฐ๋ ํ ์ค์ฒ ์ขํ.
- ์์ ๋๊ฑฐ๋ ๊ณ์ฐ๋ ๋ฒํ ์ค ์์(Color): ์์ ๋๊ฑฐ๋ ๊ณ์ฐ๋ ๋ฒํ ์ค ์์.
๋ฒํ ์ค ์ ฐ์ด๋ ์์ (GLSL)
๋ค์์ GLSL(OpenGL Shading Language)๋ก ์์ฑ๋ ๊ฐ๋จํ ๋ฒํ ์ค ์ ฐ์ด๋ ์์ ์ ๋๋ค:
#version 330 core
layout (location = 0) in vec3 aPos; // ๋ฒํ
์ค ์์น
layout (location = 1) in vec3 aNormal; // ๋ฒํ
์ค ๋ฒ์
layout (location = 2) in vec2 aTexCoord; // ํ
์ค์ฒ ์ขํ
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
out vec3 Normal;
out vec2 TexCoord;
out vec3 FragPos;
void main()
{
FragPos = vec3(model * vec4(aPos, 1.0));
Normal = mat3(transpose(inverse(model))) * aNormal;
TexCoord = aTexCoord;
gl_Position = projection * view * model * vec4(aPos, 1.0);
}
์ด ์ ฐ์ด๋๋ ๋ฒํ ์ค ์์น, ๋ฒ์ ๋ฐ ํ ์ค์ฒ ์ขํ๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ต๋๋ค. ๋ชจ๋ธ-๋ทฐ-ํฌ์ ํ๋ ฌ์ ์ฌ์ฉํ์ฌ ์์น๋ฅผ ๋ณํํ๊ณ , ๋ณํ๋ ๋ฒ์ ๊ณผ ํ ์ค์ฒ ์ขํ๋ฅผ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ก ์ ๋ฌํฉ๋๋ค.
๋ฒํ ์ค ์ ฐ์ด๋์ ์ค์ ์ ์ฉ
๋ฒํ ์ค ์ ฐ์ด๋๋ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ํจ๊ณผ์ ์ฌ์ฉ๋ฉ๋๋ค:
- ์คํค๋(Skinning): ์ฌ๋ฌ ๋ผ ๋ณํ์ ๋ธ๋ ๋ฉํ์ฌ ์บ๋ฆญํฐ๋ฅผ ์ ๋๋ฉ์ด์ ํฉ๋๋ค. ์ด๋ ๋น๋์ค ๊ฒ์ ๋ฐ ์บ๋ฆญํฐ ์ ๋๋ฉ์ด์ ์ํํธ์จ์ด์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- ๋์คํ๋ ์ด์ค๋จผํธ ๋งคํ(Displacement Mapping): ํ ์ค์ฒ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฒํ ์ค๋ฅผ ๋ณ์์์ผ ํ๋ฉด์ ๋ฏธ์ธํ ๋ํ ์ผ์ ์ถ๊ฐํฉ๋๋ค.
- ์ธ์คํด์ฑ(Instancing): ๋์ผํ ์ค๋ธ์ ํธ์ ์ฌ๋ฌ ๋ณต์ฌ๋ณธ์ ๋ค๋ฅธ ๋ณํ์ผ๋ก ๋ ๋๋งํฉ๋๋ค. ์ด๋ ์ฒ์ ๋๋ฌด๋ ํญ๋ฐ์ ์ ์์ ๊ฐ์ด ์ ์ฌํ ์ค๋ธ์ ํธ๋ฅผ ๋๋์ผ๋ก ๋ ๋๋งํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
- ์ ์ฐจ์ ์ง์ค๋ฉํธ๋ฆฌ ์์ฑ(Procedural Geometry Generation): ๋ฌผ ์๋ฎฌ๋ ์ด์ ์ ํ๋์ ๊ฐ์ด ์ฆ์์์ ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
- ์งํ ๋ณํ(Terrain Deformation): ์ฌ์ฉ์ ์ ๋ ฅ์ด๋ ๊ฒ์ ์ด๋ฒคํธ์ ๋ฐ๋ผ ์งํ ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ์์ ํฉ๋๋ค.
ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋: ํฝ์ ์์ ์ง์
ํฝ์ ์ ฐ์ด๋๋ผ๊ณ ๋ ์๋ ค์ง ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ ํ์ดํ๋ผ์ธ์ ๋ ๋ฒ์งธ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฅํ ๋จ๊ณ์ ๋๋ค. ์ฃผ์ ์ญํ ์ ๊ฐ ํ๋๊ทธ๋จผํธ(์ ์ฌ์ ํฝ์ )์ ์ต์ข ์์์ ๊ฒฐ์ ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๋ค์์ ํฌํจํฉ๋๋ค:
- ํ ์ค์ฒ๋ง(Texturing): ํ ์ค์ฒ๋ฅผ ์ํ๋งํ์ฌ ํ๋๊ทธ๋จผํธ์ ์์์ ๊ฒฐ์ ํฉ๋๋ค.
- ์กฐ๋ช (Lighting): ๋ค์ํ ๊ด์์ผ๋ก๋ถํฐ์ ์กฐ๋ช ๊ธฐ์ฌ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ ฐ์ด๋ฉ(Shading): ๋น๊ณผ ํ๋ฉด์ ์ํธ์์ฉ์ ์๋ฎฌ๋ ์ด์ ํ๊ธฐ ์ํด ์ ฐ์ด๋ฉ ๋ชจ๋ธ์ ์ ์ฉํฉ๋๋ค.
- ํ์ฒ๋ฆฌ ํจ๊ณผ(Post-Processing Effects): ๋ธ๋ฌ, ์คํ๋ ๋๋ ์์ ๋ณด์ ๊ณผ ๊ฐ์ ํจ๊ณผ๋ฅผ ์ ์ฉํฉ๋๋ค.
ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋ ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ
ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ ๋ฒํ ์ค ์ ฐ์ด๋๋ก๋ถํฐ ๋ณด๊ฐ๋ ๋ฒํ ์ค ์์ฑ์ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ์ต์ข ํ๋๊ทธ๋จผํธ ์์์ ์ถ๋ ฅ์ผ๋ก ์์ฑํฉ๋๋ค. ํน์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง, ์ผ๋ฐ์ ์ธ ์ ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ณด๊ฐ๋ ์์น(Interpolated Position): ์๋ ๊ณต๊ฐ ๋๋ ๋ทฐ ๊ณต๊ฐ์์์ ๋ณด๊ฐ๋ ๋ฒํ ์ค ์์น.
- ๋ณด๊ฐ๋ ๋ฒ์ (Interpolated Normal): ๋ณด๊ฐ๋ ๋ฒํ ์ค ๋ฒ์ ๋ฒกํฐ.
- ๋ณด๊ฐ๋ ํ ์ค์ฒ ์ขํ(Interpolated Texture Coordinates): ๋ณด๊ฐ๋ ํ ์ค์ฒ ์ขํ.
- ๋ณด๊ฐ๋ ์์(Interpolated Color): ๋ณด๊ฐ๋ ๋ฒํ ์ค ์์.
ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ ์ต์ข ํ๋๊ทธ๋จผํธ ์์์ ์ถ๋ ฅํด์ผ ํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก RGBA ๊ฐ(๋นจ๊ฐ, ๋ น์, ํ๋, ์ํ)์ผ๋ก ์ถ๋ ฅํฉ๋๋ค.
ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋ ์์ (GLSL)
๋ค์์ GLSL๋ก ์์ฑ๋ ๊ฐ๋จํ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋ ์์ ์ ๋๋ค:
#version 330 core
out vec4 FragColor;
in vec3 Normal;
in vec2 TexCoord;
in vec3 FragPos;
uniform sampler2D texture1;
uniform vec3 lightPos;
uniform vec3 viewPos;
void main()
{
// ์ฃผ๋ณ๊ด(Ambient)
float ambientStrength = 0.1;
vec3 ambient = ambientStrength * vec3(1.0, 1.0, 1.0);
// ๋๋ฐ์ฌ๊ด(Diffuse)
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * vec3(1.0, 1.0, 1.0);
// ์ ๋ฐ์ฌ๊ด(Specular)
float specularStrength = 0.5;
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
vec3 specular = specularStrength * spec * vec3(1.0, 1.0, 1.0);
vec3 result = (ambient + diffuse + specular) * texture(texture1, TexCoord).rgb;
FragColor = vec4(result, 1.0);
}
์ด ์ ฐ์ด๋๋ ๋ณด๊ฐ๋ ๋ฒ์ , ํ ์ค์ฒ ์ขํ, ํ๋๊ทธ๋จผํธ ์์น๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ๊ณ , ํ ์ค์ฒ ์ํ๋ฌ์ ์กฐ๋ช ์์น๋ ํจ๊ป ๋ฐ์ต๋๋ค. ๊ฐ๋จํ ์ฃผ๋ณ๊ด, ๋๋ฐ์ฌ๊ด, ์ ๋ฐ์ฌ๊ด ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ์กฐ๋ช ๊ธฐ์ฌ๋๋ฅผ ๊ณ์ฐํ๊ณ , ํ ์ค์ฒ๋ฅผ ์ํ๋งํ ํ, ์กฐ๋ช ๊ณผ ํ ์ค์ฒ ์์์ ๊ฒฐํฉํ์ฌ ์ต์ข ํ๋๊ทธ๋จผํธ ์์์ ์์ฑํฉ๋๋ค.
ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋์ ์ค์ ์ ์ฉ
ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ด๋ฒ์ํ ํจ๊ณผ์ ์ฌ์ฉ๋ฉ๋๋ค:
- ํ ์ค์ฒ๋ง(Texturing): ํ๋ฉด์ ํ ์ค์ฒ๋ฅผ ์ ์ฉํ์ฌ ๋ํ ์ผ๊ณผ ์ฌ์ค๊ฐ์ ๋ํฉ๋๋ค. ์ด๋ ๋ํจ์ฆ ๋งคํ, ์คํํ๋ฌ ๋งคํ, ๋ ธ๋ฉ ๋งคํ, ํจ๋ด๋์ค ๋งคํ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ํฌํจํฉ๋๋ค.
- ์กฐ๋ช ๋ฐ ์ ฐ์ด๋ฉ(Lighting and Shading): ํ ์ ฐ์ด๋ฉ, ๋ธ๋ฆฐ-ํ ์ ฐ์ด๋ฉ, ๋ฌผ๋ฆฌ ๊ธฐ๋ฐ ๋ ๋๋ง(PBR)๊ณผ ๊ฐ์ ๋ค์ํ ์กฐ๋ช ๋ฐ ์ ฐ์ด๋ฉ ๋ชจ๋ธ์ ๊ตฌํํฉ๋๋ค.
- ๊ทธ๋ฆผ์ ๋งคํ(Shadow Mapping): ๋น์ ๊ด์ ์์ ์ฌ์ ๋ ๋๋งํ๊ณ ๊น์ด ๊ฐ์ ๋น๊ตํ์ฌ ๊ทธ๋ฆผ์๋ฅผ ์์ฑํฉ๋๋ค.
- ํ์ฒ๋ฆฌ ํจ๊ณผ(Post-Processing Effects): ๋ธ๋ฌ, ์คํ๋, ์์ ๋ณด์ , ๋ธ๋ฃธ, ํผ์ฌ๊ณ ์ฌ๋์ ๊ฐ์ ํจ๊ณผ๋ฅผ ์ ์ฉํฉ๋๋ค.
- ์ฌ์ง ์์ฑ(Material Properties): ์ค๋ธ์ ํธ์ ์์, ๋ฐ์ฌ๋, ๊ฑฐ์น ๊ธฐ์ ๊ฐ์ ์ฌ์ง ์์ฑ์ ์ ์ํฉ๋๋ค.
- ๋๊ธฐ ํจ๊ณผ(Atmospheric Effects): ์๊ฐ, ์ฐ๋ฌด, ๊ตฌ๋ฆ๊ณผ ๊ฐ์ ๋๊ธฐ ํจ๊ณผ๋ฅผ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค.
์ ฐ์ด๋ ์ธ์ด: GLSL, HLSL, Metal
๋ฒํ ์ค ๋ฐ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ ์ผ๋ฐ์ ์ผ๋ก ํนํ๋ ์ ฐ์ด๋ฉ ์ธ์ด๋ก ์์ฑ๋ฉ๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ ฐ์ด๋ฉ ์ธ์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- GLSL (OpenGL Shading Language): OpenGL๊ณผ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. GLSL์ C์ ์ ์ฌํ ์ธ์ด๋ก ๊ทธ๋ํฝ ์ฐ์ฐ์ ์ํํ๊ธฐ ์ํ ๊ด๋ฒ์ํ ๋ด์ฅ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
- HLSL (High-Level Shading Language): DirectX์ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. HLSL ๋ํ C์ ์ ์ฌํ ์ธ์ด์ด๋ฉฐ GLSL๊ณผ ๋งค์ฐ ๋น์ทํฉ๋๋ค.
- Metal Shading Language: Apple์ Metal ํ๋ ์์ํฌ์ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. Metal Shading Language๋ C++14๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ GPU์ ๋ํ ์ ์์ค ์ก์ธ์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด๋ฌํ ์ธ์ด๋ค์ ๊ทธ๋ํฝ ํ๋ก๊ทธ๋๋ฐ์ ์ํด ํน๋ณํ ์ค๊ณ๋ ๋ฐ์ดํฐ ์ ํ, ์ ์ด ํ๋ฆ๋ฌธ, ๋ด์ฅ ํจ์ ์งํฉ์ ์ ๊ณตํฉ๋๋ค. ๋ง์ถคํ ์ ฐ์ด๋ ํจ๊ณผ๋ฅผ ๋ง๋ค๊ณ ์ ํ๋ ๊ฐ๋ฐ์์๊ฒ๋ ์ด๋ฌํ ์ธ์ด ์ค ํ๋๋ฅผ ๋ฐฐ์ฐ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค.
์ ฐ์ด๋ ์ฑ๋ฅ ์ต์ ํ
์ ฐ์ด๋ ์ฑ๋ฅ์ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ์ข์ ๊ทธ๋ํฝ์ ๊ตฌํํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ค์์ ์ ฐ์ด๋ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ํ์ ๋๋ค:
- ํ ์ค์ฒ ์กฐํ ์ต์ํ: ํ ์ค์ฒ ์กฐํ๋ ๋น๊ต์ ๋น์ผ ์ฐ์ฐ์ ๋๋ค. ๊ฐ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํ๊ฑฐ๋ ๋ ๊ฐ๋จํ ํ ์ค์ฒ๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ค์ฒ ์กฐํ ํ์๋ฅผ ์ค์ด์ธ์.
- ์ ์ ๋ฐ๋ ๋ฐ์ดํฐ ์ ํ ์ฌ์ฉ: ๊ฐ๋ฅํ ๋ `float32` ๋์ `float16`๊ณผ ๊ฐ์ ์ ์ ๋ฐ๋ ๋ฐ์ดํฐ ์ ํ์ ์ฌ์ฉํ์ธ์. ํนํ ๋ชจ๋ฐ์ผ ์ฅ์น์์ ๋ฎ์ ์ ๋ฐ๋๋ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋ณต์กํ ์ ์ด ํ๋ฆ ํผํ๊ธฐ: ๋ฃจํ๋ ๋ถ๊ธฐ์ ๊ฐ์ ๋ณต์กํ ์ ์ด ํ๋ฆ์ GPU๋ฅผ ์ง์ฐ์ํฌ ์ ์์ต๋๋ค. ์ ์ด ํ๋ฆ์ ๋จ์ํํ๊ฑฐ๋ ๋ฒกํฐํ๋ ์ฐ์ฐ์ ๋์ ์ฌ์ฉํด ๋ณด์ธ์.
- ์ํ ์ฐ์ฐ ์ต์ ํ: ์ต์ ํ๋ ์ํ ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ๋ถํ์ํ ๊ณ์ฐ์ ํผํ์ธ์.
- ์ ฐ์ด๋ ํ๋กํ์ผ๋ง: ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ฐ์ด๋์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ธ์. ๋๋ถ๋ถ์ ๊ทธ๋ํฝ API๋ ์ ฐ์ด๋ ์ฑ๋ฅ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋๋ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ ฐ์ด๋ ๋ณํ ๊ณ ๋ ค: ๋ค์ํ ํ์ง ์ค์ ์ ๋ํด ๋ค๋ฅธ ์ ฐ์ด๋ ๋ณํ์ ์ฌ์ฉํ์ธ์. ๋ฎ์ ์ค์ ์๋ ๊ฐ๋จํ๊ณ ๋น ๋ฅธ ์ ฐ์ด๋๋ฅผ, ๋์ ์ค์ ์๋ ๋ ๋ณต์กํ๊ณ ์์ธํ ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ์ธ์. ์ด๋ฅผ ํตํด ์๊ฐ์ ํ์ง๊ณผ ์ฑ๋ฅ์ ๋ง๋ฐ๊ฟ ์ ์์ต๋๋ค.
ํฌ๋ก์ค ํ๋ซํผ ๊ณ ๋ ค ์ฌํญ
์ฌ๋ฌ ํ๋ซํผ์ฉ 3D ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋๋ ์ ฐ์ด๋ ์ธ์ด์ ํ๋์จ์ด ๊ธฐ๋ฅ์ ์ฐจ์ด์ ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. GLSL๊ณผ HLSL์ ์ ์ฌํ์ง๋ง ํธํ์ฑ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ์์ต๋๋ค. Apple ํ๋ซํผ์ ํนํ๋ Metal Shading Language๋ ๋ณ๋์ ์ ฐ์ด๋๊ฐ ํ์ํฉ๋๋ค. ํฌ๋ก์ค ํ๋ซํผ ์ ฐ์ด๋ ๊ฐ๋ฐ ์ ๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํฌ๋ก์ค ํ๋ซํผ ์ ฐ์ด๋ ์ปดํ์ผ๋ฌ ์ฌ์ฉ: SPIRV-Cross์ ๊ฐ์ ๋๊ตฌ๋ ์ ฐ์ด๋๋ฅผ ๋ค๋ฅธ ์ ฐ์ด๋ฉ ์ธ์ด ๊ฐ์ ๋ณํํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ ฐ์ด๋๋ฅผ ํ ์ธ์ด๋ก ์์ฑํ ๋ค์ ๋์ ํ๋ซํผ์ ์ธ์ด๋ก ์ปดํ์ผํ ์ ์์ต๋๋ค.
- ์ ฐ์ด๋ ํ๋ ์์ํฌ ์ฌ์ฉ: Unity ๋ฐ Unreal Engine๊ณผ ๊ฐ์ ํ๋ ์์ํฌ๋ ๊ธฐ๋ณธ ํ๋ซํผ ์ฐจ์ด๋ฅผ ์ถ์ํํ๋ ์์ฒด ์ ฐ์ด๋ ์ธ์ด์ ๋น๋ ์์คํ ์ ์ ๊ณตํฉ๋๋ค.
- ๊ฐ ํ๋ซํผ์ ๋ํด ๋ณ๋์ ์ ฐ์ด๋ ์์ฑ: ์ด๊ฒ์ด ๊ฐ์ฅ ๋ ธ๋ ์ง์ฝ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด์ง๋ง, ๊ฐ ํ๋ซํผ์์ ์ ฐ์ด๋ ์ต์ ํ๋ฅผ ์ต๋ํ ์ ์ดํ๊ณ ์ต์์ ์ฑ๋ฅ์ ๋ณด์ฅํฉ๋๋ค.
- ์กฐ๊ฑด๋ถ ์ปดํ์ผ: ์ ฐ์ด๋ ์ฝ๋์์ ์ ์ฒ๋ฆฌ๊ธฐ ์ง์๋ฌธ(#ifdef)์ ์ฌ์ฉํ์ฌ ๋์ ํ๋ซํผ์ด๋ API์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ํฌํจํ๊ฑฐ๋ ์ ์ธํฉ๋๋ค.
์ ฐ์ด๋์ ๋ฏธ๋
์ ฐ์ด๋ ํ๋ก๊ทธ๋๋ฐ ๋ถ์ผ๋ ๋์์์ด ์งํํ๊ณ ์์ต๋๋ค. ๋ ์ค๋ฅด๋ ๋ช ๊ฐ์ง ํธ๋ ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ ์ด ํธ๋ ์ด์ฑ(Ray Tracing): ๋ ์ด ํธ๋ ์ด์ฑ์ ๊ด์ ์ ๊ฒฝ๋ก๋ฅผ ์๋ฎฌ๋ ์ด์ ํ์ฌ ์ฌ์ค์ ์ธ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ๋ ๋๋ง ๊ธฐ์ ์ ๋๋ค. ๋ ์ด ํธ๋ ์ด์ฑ์ ์ฌ์ ์ค๋ธ์ ํธ์ ๊ด์ ์ ๊ต์ฐจ์ ์ ๊ณ์ฐํ๊ธฐ ์ํด ํนํ๋ ์ ฐ์ด๋๊ฐ ํ์ํฉ๋๋ค. ์ค์๊ฐ ๋ ์ด ํธ๋ ์ด์ฑ์ ์ต์ GPU์์ ์ ์ ๋ ๋ณดํธํ๋๊ณ ์์ต๋๋ค.
- ์ปดํจํธ ์ ฐ์ด๋(Compute Shaders): ์ปดํจํธ ์ ฐ์ด๋๋ GPU์์ ์คํ๋๋ ํ๋ก๊ทธ๋จ์ผ๋ก, ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ , ์ด๋ฏธ์ง ์ฒ๋ฆฌ, ์ธ๊ณต ์ง๋ฅ๊ณผ ๊ฐ์ ๋ฒ์ฉ ๊ณ์ฐ์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ๋ฉ์ ์ ฐ์ด๋(Mesh Shaders): ๋ฉ์ ์ ฐ์ด๋๋ ๊ธฐ์กด ๋ฒํ ์ค ์ ฐ์ด๋๋ณด๋ค ๋ ์ ์ฐํ๊ณ ํจ์จ์ ์ผ๋ก ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. GPU์์ ์ง์ ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์กฐ์ํ ์ ์์ต๋๋ค.
- AI ๊ธฐ๋ฐ ์ ฐ์ด๋(AI-Powered Shaders): ๋จธ์ ๋ฌ๋์ ์ฌ์ฉํ์ฌ ํ ์ค์ฒ, ์กฐ๋ช ๋ฐ ๊ธฐํ ์๊ฐ ํจ๊ณผ๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ AI ๊ธฐ๋ฐ ์ ฐ์ด๋๊ฐ ๋ง๋ค์ด์ง๊ณ ์์ต๋๋ค.
๊ฒฐ๋ก
๋ฒํ ์ค ๋ฐ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ 3D ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ํ์ ๊ตฌ์ฑ ์์๋ก, ๊ฐ๋ฐ์์๊ฒ ๋๋๊ณ ์ฌ์ค์ ์ธ ๋น์ฃผ์ผ์ ๋ง๋ค ์ ์๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ์ ฐ์ด๋์ ์ญํ ๊ณผ ๊ธฐ๋ฅ์ ์ดํดํจ์ผ๋ก์จ 3D ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ํ ๊ฐ๋ฅ์ฑ์ ์ด ์ ์์ต๋๋ค. ๋น๋์ค ๊ฒ์, ๊ณผํ ์๊ฐํ, ๋๋ ๊ฑด์ถ ๋ ๋๋ง์ ๊ฐ๋ฐํ๋ , ๋ฒํ ์ค ๋ฐ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ฅผ ๋ง์คํฐํ๋ ๊ฒ์ ์ํ๋ ์๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฌ์ฑํ๋ ๋ฐ ํต์ฌ์ ๋๋ค. ์ด ์ญ๋์ ์ธ ๋ถ์ผ์์ ์ง์์ ์ธ ํ์ต๊ณผ ์คํ์ ์์ฌํ ์ฌ์ง์์ด ์ปดํจํฐ ๊ทธ๋ํฝ ๋ถ์ผ์์ ํ์ ์ ์ด๊ณ ํ๊ธฐ์ ์ธ ๋ฐ์ ์ ์ด๋ ๊ฒ์ ๋๋ค.